#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <functional>
#include <sys/types.h>
#include <sys/wait.h>

void Wait(int signum)
{
    while (true)
    {
        int n = waitpid(-1, nullptr, WNOHANG);
        if (n > 0)
        {
            std::cout << "子进程退出了" << n << std::endl;
        }
        else if (n == 0)
        {
            break;
        }
        else
        {
            std::cout << "error" << std::endl;
            break;
        }
    }
}
int main()
{
    signal(SIGCHLD, Wait);

    for (int i = 0; i < 10; i++)
    {
        int id = fork();
        if (id == 0)
        {
            sleep(5);
            exit(1);
        }
    }

    while (true)
    {
        std::cout << "我是父进程，我在执行我的task" << std::endl;
        sleep(1);
    }

    return 0;
}

// void handlersign(int sig)
// {
//     std::cout << "#####################" << std::endl;
//     printf("我是[%d]号信号\n", sig);
//     std::cout << "#####################" << std::endl;
// }

// void PrintPending(sigset_t &set)
// {
//     for (int i = 31; i > 0; i--)
//     {
//         if (sigismember(&set, i))
//             std::cout << '1';
//         else
//             std::cout << '0';
//     }
//     std::cout << std::endl;
// }

// int main()
// {
//     sigset_t pinding, block;
//     sigemptyset(&pinding);
//     sigemptyset(&block);

//     sigaddset(&block, 2);
//     sigset_t old;
//     sigprocmask(SIG_SETMASK, &block, &old);
//     int cnt = 0;
//     while (true)
//     {
//         sigpending(&pinding);
//         PrintPending(pinding);
//         sleep(1);
//         if (cnt == 10)
//             sigprocmask(SIG_SETMASK, &old, nullptr);
//         cnt++;
//     }

//     return 0;
// }

// // //////////func////////////
// void Sched()
// {
//     std::cout << "我是进程调度" << std::endl;
// }
// void MemManger()
// {
//     std::cout << "我是周期性的内存管理，正在检查有没有内存问题" << std::endl;
// }
// void Fflush()
// {
//     std::cout << "我是刷新程序，我在定期刷新内存数据，到磁盘" << std::endl;
// }
// // /////////////////////////
// // 每隔1s，完成一些任务
// void handlersign(int sig)
// {
//     std::cout << "#####################" << std::endl;
//     std::vector<std::function<void()>> fun{Sched, MemManger, Fflush};
//     for (auto &f : fun)
//     {
//         f();
//     }
//     alarm(5);
// }

// int main()
// {
//     signal(14, handlersign);
//     signal(2, SIG_IGN);

//     alarm(5);
//     while (true)
//     {
//         pause();
//     }

//     return 0;
// }

// int main()
// {
//     for (int i = 1; i <= 31; i++)
//     {
//         signal(i, handlersign);
//     }

//     for (int i = 1; i <= 31; i++)
//     {
//         if (i != 9 && i != 19) // 9 和 19 号无法被捕捉
//             raise(i);
//         sleep(1);
//     }

//     return 0;
// }